Cypress.Commands.add('getSessionStorage', (key) => {
    cy.window().then((window) => window.sessionStorage.getItem(key));
});

Cypress.Commands.add('setSessionStorage', (key, value) => {
    cy.window().then((window) => {
        window.sessionStorage.setItem(key, value);
    });
});

Cypress.Commands.add('getLocalStorage', (key) => {
    cy.window().then((window) => window.localStorage.getItem(key));
});

Cypress.Commands.add('setLocalStorage', (key, value) => {
    cy.window().then((window) => {
        window.localStorage.setItem(key, value);
    });
});

Cypress.Commands.add('checkToken', (token) => {
    cy.window().its('localStorage.token').should('eq', token);
});


Cypress.Commands.add('login', () => {
    const baseUrl = Cypress.config("baseUrl");
    const environment = Cypress.env("environment");
    cy.fixture(environment + '/user.json').as('user');
    cy.visit(baseUrl);
    cy.url().should('contain', baseUrl);
    cy.get('@user').then((data) => {
        console.log(data.username);
        cy.get(data[0].usernameId).type(data[0].username);
        cy.get(data[0].passwordId).type(data[0].password);
        if (data[0].rememberId) {
            cy.get(data[0].rememberId).click();
        }
        cy.get(data[0].LoginClass).click();
    });
});

Cypress.Commands.add('findAllTableRow', () => {
    cy.get('tbody > .ant-table-row');
});

Cypress.Commands.add('findTableRow', (row) => {
    cy.get('tbody > tr:not(:first-child)').eq(row);
});

Cypress.Commands.add('findTableData', (row, col) => {
    cy.get('tbody > tr:not(:first-child)').eq(row).find('td').eq(col);
});

Cypress.Commands.add('uuid', () => {
    var text = "";
    var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
    for (var i = 0; i < 32; i++)
        text += possible.charAt(Math.floor(Math.random() * possible.length));
    return cy.wrap(text);
});


// runCases为简化后的命令, 
Cypress.Commands.add('runCases', (param) => {
    // console.log("param---", param, typeof param);
    // console.log("commonCmd--", feature);
    let cases = param;
    if (cases.length > 0) {
        Object.keys(cases).forEach((index) => {
            obj = cases[index];
            switch (obj.type) {
                //所有可输入的元素, input, textarea等等
                case "text":
                    cy.get(obj.elementId).type(obj.value);
                    break;
                // clear, 清除输入内容
                case "clear":
                    cy.get(obj.elementId).clear();
                    break;
                // 点击元素
                case "click":
                    console.log("obj.elementId----", obj.elementId);
                    console.log("obj.value---",  obj.value, typeof obj.value)
                    if (obj.elementId && obj.value  !== '') {
                        // id和value都有的时候, 组合生效
                        cy.get(obj.elementId).contains(obj.value).click();
                    } else {
                        // id 和value只有其中一个时, 按照有的元素生效
                        if (obj.elementId) {
                            cy.get(obj.elementId).click();
                        } else {
                            cy.contains(obj.value).click();
                        }
                    }
                    break;
                // 触发特定元素的事件
                case "trigger":
                    // console.log("trigger-emement---", obj.elementId)
                    cy.get(obj.elementId).trigger(obj.value)
                    break;
                // 验证元素
                case "should":
                    const shoulds = obj.value.split(',');
                    cy.get(obj.elementId).should.apply(cy, shoulds);
                    break;
                //验证页面或者元素中是否包含文本
                case "contains":
                    // const contailsValues = obj.value.split(',');
                    // console.log("contailsValues----", contailsValues);
                    if (obj.elementId) {
                        cy.get(obj.elementId).contains(`${obj.value}`);
                    } else {
                        cy.contains(`${obj.value}`);
                    }
                    break;
                case "visit":
                    // url跳转
                    cy.visit(obj.value)
                    break;
                // 等待一定时间
                case "wait":
                    cy.wait(obj.value * 1);
                    break;
                // 下面是对复杂附件的封装
                case "select":
                    cy.get(obj.elementId).click();
                    // cy.get(obj.selectItem).contains(obj.value).click();
                    break;
                case "table":
                    // cy.findAllTableRow().contains(obj.value).get(obj.id).click();
                    // cy.findAllTableRow().first().get(obj.id).click();
                    for (var t = 0; t < obj.pageSize; t++) {
                        cy.findAllTableRow().eq(t).find(obj.value);
                    }
                    cy.findAllTableRow().contains(obj.value);
                    cy.findAllTableRow().first().get(obj.id).first().click();
                    // cy.findAllTableRow().find(obj.id).click();
                    break;
                default:
                    cy.log("type类型未定义");
                    break;
            }

        });
    }

    // cy.get(`${result}`).should('have.length', 1);
});

// commonCmd为
Cypress.Commands.add('commonCmd', (feature, scenario, action, param, result) => {
    // console.log("param---", param, typeof param);
    // console.log("commonCmd--", feature);
    let cases = [];
    if (typeof param === 'string' && param.length > 0) {
        cases = JSON.parse(param);
    } else if (Array.isArray(param)) {
        cases = param;
    }
    console.log("cases---", cases);
    if (cases.length > 0) {
        Object.keys(cases).forEach((index) => {
            obj = cases[index];
            console.log("obj---", obj);
            switch (obj.type) {
                //所有可输入的元素, input, textarea等等
                case "text":
                    cy.get(obj.id).type(obj.value);
                    break;
                // clear, 清除输入内容
                case "clear":
                    cy.get(obj.id).clear();
                    break;
                // 点击元素
                case "click":
                    if (obj.id && obj.value) {
                        // id和value都有的时候, 组合生效
                        cy.get(obj.id).contains(obj.value).click();
                    } else {
                        // id 和value只有其中一个时, 按照有的元素生效
                        if (obj.id) {
                            cy.get(obj.id).click();
                        } else {
                            cy.contains(obj.value).click();
                        }
                    }
                    break;
                // 触发特定元素的事件
                case "trigger":
                    const triggerValues = obj.value.split(',');
                    cy.get(obj.id).trigger.apply(cy, triggerValues);
                    break;
                // 验证元素
                case "should":
                    const shoulds = obj.value.split(',');
                    cy.get(obj.id).should.apply(cy, shoulds);
                    break;
                //验证页面或者元素中是否包含文本
                case "contains":
                    // const contailsValues = obj.value.split(',');
                    // console.log("contailsValues----", contailsValues);
                    if (obj.id) {
                        cy.get(obj.id).contains(`${obj.value}`);
                    } else {
                        cy.contains(`${obj.value}`);
                    }
                    break;
                case "wait":
                    cy.wait(obj.value);
                    break;
                // 下面是对复杂附件的封装
                case "select":
                    cy.get(obj.id).click();
                    cy.get(obj.selectItem).contains(obj.value).click();
                    break;
                case "table":
                    // cy.findAllTableRow().contains(obj.value).get(obj.id).click();
                    // cy.findAllTableRow().first().get(obj.id).click();
                    for (var t = 0; t < obj.pageSize; t++) {
                        cy.findAllTableRow().eq(t).find(obj.value);
                    }
                    cy.findAllTableRow().contains(obj.value);
                    cy.findAllTableRow().first().get(obj.id).first().click();
                    // cy.findAllTableRow().find(obj.id).click();
                    break;
                default:
                    cy.log("type类型未定义");
                    break;
            }

        });
    }





    // action,  定义好的提交按钮
    if (action && action.length > 0) {
        cy.get(action).click();
    }
    // 页面检查
    if (result && result.length > 0) {
        cy.contains(`${result}`);
    }
    console.log(result, "result");
    // cy.get(`${result}`).should('have.length', 1);
});

Cypress.Commands.add('exeDBScript', (queryStr, updateStr, flag) => {
    cy.task("dbQuery", { "query": queryStr }).then(data => {
        if (data.length == flag) { //flag 0: data not exist, 1: data exist
            cy.task("dbQuery", { "query": updateStr });
        }
    });
});